package com.java.reflect;

/**
 * Java枚举类型enum使用
 * 枚举其实就是普通类的特例，可以有自己的变量，也可以定义自己的方法或者继承抽象类和实现接口
 * 1)如果枚举类中定义抽象的方法，那么每个枚举都要实现该方法
 * 2)如果枚举类继承抽象类或者实现接口，那么可以在枚举类中实现该方法（所有枚举共用这些方法），也可以在每个枚举中单独实现该方法
 */
public class SeasonEnumTest{
	public enum SeasonEnum {
		//编译器默认的语法:定义四个枚举（公开静态常量)，并调用私有构造器为枚举初始化，再让每个枚举实现抽象方法。
		SPRING("hehe"){
			@Override
			public String getInfo() {
				// TODO Auto-generated method stub
				return "春天";
			}
		},
		SUMMER("haha"){
			@Override
			public String getInfo() {
				return "夏天";
			}
		},
		AUTUMN("xixi"){
			@Override
			public String getInfo() {
				return "秋天";
			}
		},
		WINTER("wuwu"){
			@Override
			public String getInfo() {
				return "冬天";
			}
		};
		
		//public static final SeasonEnum SPRING=new SeasonEnum("hehe");
		//注意：编译器默认的语法，变量和方法定义必须放在所有枚举值定义的后面。
		private String value;
		public abstract String getInfo();//让每个枚举扩展一个抽象方法
		private SeasonEnum(){
			
		}
		//定义有参数的构造方法,供内部使用，用法：SPRING("..."),外部使用SeasonEnum.SPRING时，枚举类加载时会初始化所有枚举常量(枚举实例)。
		private SeasonEnum(String value){
			this.value =value; 
		}
		       
		//每个枚举都可以访问枚举类中定义的方法
		public String getValue(){       
			return this.value;       
		}
		//访问枚举时默认调用toString()方法
		public String toString(){
			switch(this){
			case SPRING: return "春天";
			case SUMMER: return "夏天";
			case AUTUMN: return "秋天";
			case WINTER: return "冬天";
			default:return null;
			}
		}
		
	}
	public static void main(String[] args) {
		System.out.println(SeasonEnum.SPRING.getValue());
		System.out.println(SeasonEnum.SPRING.getInfo());
		SeasonEnum[] enums=SeasonEnum.values();
		for(SeasonEnum enu:enums){
			System.out.println(enu.toString());
		}
	}
}

/*
枚举类映射成的java原型：

public final class SeasonEnum extends Enum{
	public static final SeasonEnum SPRING;
	public static final SeasonEnum SUMMER;
	public static final SeasonEnum AUTUMN;
	public static final SeasonEnum WINTER;
	private String value;
	private static final SeasonEnum ENUM$VALUES[];
	static{
		SPRING=new SeasonEnum("SPRING",0,"hehe");
		SUMMER=new SeasonEnum("SUMMER",1,"haha");
		AUTUMN=new SeasonEnum("AUTUMN",2,"hehe");
		WINTER=new SeasonEnum("WINTER",3,"hehe");
  		ENUM$VALUES = new SeasonEnum[] {SPRING, SUMMER, AUTUMN,WINTER};
 	}

	private SeasonEnum(){
		
	}
	private SeansonEnum(String s,int i,String value){
		super(s,i);
		this.value=value;
	}
	
	public String getValue(){       
		return this.value;       
	}

	public String toString(){
		switch(this){
		case SPRING: return "春天";
		case SUMMER: return "夏天";
		case AUTUMN: return "秋天";
		case WINTER: return "冬天";
		default:return null;
		}
	}
	
}
*/
